# 面经手册 · 开篇《面试官都问我啥》
作者:小傅哥
博客:https://bugstack.cn (opens new window)
原文:https://mp.weixin.qq.com/s/yXVc6pdu28YAixBjs-bmOg (opens new window)
八股:https://t.zsxq.com/17UIvdgb3 (opens new window) - JavaGuide 星球含有更全、更细、更多的八股系列内容,推荐加入学习。
沉淀、分享、成长,让自己和他人都能有所收获!😄
# 一、前言
一直以来都有小伙伴问我什么时候出一些面试系列的文章,脑袋一热一口答应下来,《重学Java设计模式》写完就安排。但是怎么写,要写成什么样才对读者有帮助成了难点。
再三思考,面试只是一时的,工作、学习,才是长久坚持的。很多人面试不理想多半也是来自于自我学习能力的不足和工作内容的单一以及业务体量小导致。所以我想从全局培养人才的角度出发,也算是技术成长的经历中提取学习框架,帮助小伙伴们提升技术能力的同时也可以应对面试。
好像面试越来越难?
招聘一个合格的研发有多难?近半年我差不多收了400份简历,筛选简历到初面通过的不足10%。这里面很多人连简历都写不好,面试时也经常回答不到点上,技术栈广度不够深度不足,项目经验缺乏,没有解决复杂场景的经验等等。但也同样有很多优秀的,手里有多个offer最后流失。对于企业是损失,但对于个人来说,我佩服这样的人,他们技术好有更多的选择。
30岁要有30岁的能力,35岁要有35的经历
有时候不是面试难,而是年龄与能力不匹配,对企业招聘来说,同样能力下你价格还高,为什么不招聘个年轻有活力的呢?(什么?找对象
) 有时候你会说这是贩卖焦虑,这是洗脑,但这条路上终究有人前进,有人被动回退。
学习是你这个职业一辈子的事
手里有个 1 2 3
,不要想着去怼别人的 4 5 6
,因为还有你不知道的 7 8 9
。保持空瓶心态从0
开始才能学到10全
。
这一篇我会从简历的视角出发,简要概况出研发人员应该具备的能力 有了这篇的基础上,后续再逐步扩展系列的面试场景,以及对应的面试题细节讲解和从哪学习这些知识的一个引导。
# 二、程序员的愿望
5年,时间不长不短,有人结婚生娃、有人回家开店、也有人继续在大城市打拼。
头两天在研发群里做了一次愿望留言,期待下5年后的自己。如图;
留言心愿集中的点,在于;
- 身体健康
- 头发还在
- 加薪升职
努力!也照顾好自己。奋斗!也爱惜好身体。
愿望地址:https://github.com/fuzhengwei/CodeGuide/issues/111 (opens new window)
# 三、谢飞机简历
这是一份工作4年的谢飞机简历,如下;
- 先看看简历,与自己的对比下,有什么可取之处
- 如果你是求职者,还希望在这份简历里补充什么
- 如果你是面试官,你举得这份简历还差了什么
- 这一份开篇的简历,可以阅读完下面的面试框架进行比对,看看你应该做些什么 。
- 后续的系列面经文章,将围绕简历开始,提问和讲解面试题。
# 四、面试框架
# 1. 自我介绍
- 1分钟左右的自我介绍,简要的描述出;姓名、毕业时间、工作年限、工作经历、技术影响力[博客、Github、开源贡献、专利]等。
- 如果有较大型项目或者大家有一致性认知的项目和技术难点攻克,可以简单说出项目名称等。
- 方法论沉淀相关;架构设计能力、带过小组或者团队、跨部门协调、流程规范制定和执行等。
你要透露出的核心点就是个人的一个基本信息,以及项目和技术上的沉淀,给面试官留出和你聊下去的话题
例如:
面试官好,我叫谢飞机,16年毕业于天津工业大学,软件工程专业,目前已工作4年。我从毕业后就职于途乐数字科技,负责营销和订单系统开发。在系统搭建、代码优化、问题处理上有较丰富的经验和处理能力。同时也喜欢写一些技术博客和看一些技术书籍,另外在Spring、Dubbo等源码学习上有过一些研究以及复用到业务开发中。感谢!
# 2. 面试类型
依赖于面试官的不同,与你一起进入面试的方式也不同,比如;
- 直接提问型;直接提问一些技术栈问题或者有些公司会考算法。
- 场景引导型;通过让你介绍的一些项目经历,用过什么技术栈,在场景下提问。
- 连环追问型;从一个点出发,你的每一个回答都在为下一个深入的问题做开始。
- 压力逼问型;压力面一般不多,但抗的住并能抓住重点,offer基本稳了。
直接提问型 需要你有一定的技术栈广度和深度,问题往往也比较有跳跃性。但大部分题目会是热点问题,但可能不是日常开发中频率最高的技术点。
场景引导型 需要你有一定的开发架构经验和项目落地能力,这部分问题基本都会结合实际的业务场景进行提问,每一个场景就是一个复杂问题问题的解决能力。这里问到的场景会与你简历中的工作经历和项目相关,但复杂程度可能会超过你目前简历中的项目内容。比如;你写了一个订单类的,那么会问你秒杀的实际解决方案。这样的问题很难背题应付,需要真的经历过,研究过。
连环追问型 从一个小的技术点开始,一层层往下剥,每一次的回答也几乎都是下一个问题的深入点的来源。这种问题不仅考察面试者,也是对面试官的考验。往往在招聘高级别开发时会进行定向深入挖掘提问,找到匹配的行业专家级技术人员。
压力逼问型 这种面试方式一般不多,但可能有的高级面试官会让你感受到这种气场。一方面是确实人家有这样的技术气势,另外一个是来自自己的紧张。如果会不是问题,还会在面试官那留下很高的打分。如果不会,那么会感觉到你越不会什么,面试官越问你什么。
以上就是基本这四类面试官的风格,求职除了技术能力外还有一部分是眼缘,不一定一个问题不会就是你不优秀,而是在寻找这个职位最适合匹配度的人员。
# 3. 算法
算法一整块内容来考的互联网公司目前有一些,比如;头条、谷歌、百度,但不一定所有职位都需要去考算法。热频考点大部分可以分如下几块:
- 动态规划
- 数据结构
- 算法思维
在题目上一般会有排序、二分查找、回文链表、反链链表,和数据结构设计方面。这些题目可以通过 leetcode-cn.com 刷题进行练习。
# 4. 技术栈
技术栈考查的是程序员在编程开发领域学习的广度和深度,日常的业务开发往往提升都是对API使用的熟练程度,如果再缺少一些系统设计和技术难点攻克,或者说没有大流量的冲击。那么确实很难回答一些技术深度问题。如下汇总了基本会再技术栈面试中涉及的考题,可以参考提升个人技术能力。
# 4.1 技能
https://t.zsxq.com/17UIvdgb3 (opens new window) - JavaGuide 星球含有更全、更细、更多的八股系列内容,推荐加入学习。
# 4.1.1 Java
# JDK源码
HashMap
- HashMap的数据结构(1.7、1.8的区别)
- HashMap的实现原理
- HashMap扩容为什么是2^n-1
- HashMap是线程安全的吗
- HashMap、HashTable是什么关系?
ThreadLocal
- 讲讲你对ThreadLocal的一些理解
- ThreadLocal有哪些应用场景
- 了解过FastThreadLocal吗
ArrayList、LinkList
- 是否保证线程安全
- 底层数据结构
- 插入和删除是否受元素位置的影响
- 是否支持快速随机访问
- 内存空间占用
- 如何进行扩容的,默认初始化空间是多少
String StringBuffer StringBuilder
- 有什么区别
- 是线程安全的吗
jdk1.8的新特性
- lambda表达式
- Functional Interfaces
- Optionals
- Stream 流
- Parallel-Streams 并行流
# 并发编程(j.u.c)
volatile
- volatile 的作用和使用场景
- volatile 如何保证指令重排
- 什么情况下会发生指令重排
synchronized
- 一般用在什么场景
- 实现原理
- 锁升级过程(偏向锁、轻量级锁、重量级锁)
- 这是JVM层面锁,还是JDK层面锁{JVM层面}
- 这是一种悲观锁还是乐观锁{悲观锁是独占锁}
lock
- 这是JVM层面锁,还是JDK层面锁{JDK层面}
- 这是一种悲观锁还是乐观锁
- 是可重入锁吗
ReentrantLock
- 与synchronized相比较有什么不同
- ReentrantLock 与 Lock 的关系
- 锁过程中是否可中断,与之对应的synchronized可中断吗
CAS
- Unsafe 类的作用
- CAS 的理解(compareAndSet)
- 什么是ABA问题
- CAS的实现有什么(AtomicInteger)
AQS
- 实现类有哪些 ReentrantLock、Semaphore、CountDownLatch、CyclicBarrier
- 实现了AQS的锁有哪些 自旋锁、互斥锁、读锁写锁、条件产量、信号量、栅栏都是AQS的衍生物 内存屏障,几乎所有的处理器至少支持一种粗粒度的屏障指令,通常被称为“栅栏(Fence)”
# 多线程
线程池的种类
- newCachedThreadPool
- newFixedThreadPool
- newScheduledThreadPool
- newSingleThreadExecutor
线程的生命周期
- 新建、就绪、运行、阻塞(等待阻塞、同步阻塞、其他阻塞)、死亡
# JVM
- GC 优化
- JVM 逃逸分析
- 类的对象头都包括什么
- new Object() 初始化都做了什么
- 运行时数据区
- Java的内存模型以及GC算法
# 设计模式
- 设计模式6大原则 单一职责(一个类和方法只做一件事)、里氏替换(多态,子类可扩展父类)、依赖倒置(细节依赖抽象,下层依赖上层)、接口隔离(建立单一接口)、迪米特原则(最少知道,降低耦合)、开闭原则(抽象架构,扩展实现)
- 创建型模式 这类模式提供创建对象的机制, 能够提升已有代码的灵活性和可复用性。
- 结构型模式 这类模式介绍如何将对象和类组装成较大的结构, 并同时保持结构的灵活和高效。
- 行为模式 这类模式负责对象间的高效沟通和职责委派。
# 反射、代理
- 怎么实现反射调用方法
- 怎么代理一个类,有什么场景使用
- 类代理的原理是什么
- 有什么框架可以做类代理
# 4.1.2 Redis
# 命令
- 计数命令
- 排序命令
- 加锁命令
# 架构
- 常用的数据类型
- 数据淘汰策略
- 单线程的为什么那么快
- RDB和AOF的优缺点
- 持久化策略选择
# 应用
- 缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级
- Pipeline有什么好处,为什么要用pipeline
- 是否使用过Redis集群,集群的原理是什么
- Redis的同步机制了解么
# 4.1.3 Mysql
# 锁
- 全局锁
- 表锁
- 行锁
- 乐观锁、悲观锁
- 排他锁
- 锁优化
# 事务
- 事物特征
- 脏读
- 幻读
- 不可重复读
- 事物隔离
- 并发事物
- 事物实现原理
# 日志
- 慢查询日志
- 错误日志
- redo log(重做日志)
- binlog(归档日志)
- undo log(回滚日志)
# 索引
- 聚集索引 VS 非聚集索引
- 最左匹配原则
- 前缀索引
# 引擎
- InnoDB
- MyISAM
# 4.2 框架
# 4.2.1 Spring
- Bean的注册过程
- Bean的定义都包括什么信息
- Spring 事务中的隔离级别有哪几种
- schedule 使用
# 4.2.2 Mybatis
- mybatis在spring的使用中,只需要定义接口,就可以和xml中的配置的sql语句,进行关联,执行数据库增删改查操作。怎么实现的
- session是怎么管理的
# 4.3.3 SpringBoot
- SpringBoot 怎么开发一个自己的Stater
# 4.2.4 SpringCloud
- spring cloud 断路器的作用是什么
- spring cloud 的核心组件有哪些 Eureka:服务注册于发现。 Feign:基于动态代理机制,根据注解和选择的机器,拼接请求 url 地址,发起请求。 Ribbon:实现负载均衡,从一个服务的多台机器中选择一台。 Hystrix:提供线程池,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题。 Zuul:网关管理,由 Zuul 网关转发请求给对应的服务。
# 4.3 组件
# 4.3.1 Dubbo
- 通信模型是什么样的
- Dubbo 和 Spring Cloud 有什么区别
- dubbo都支持什么协议,推荐用哪种 dubbo://(推荐) rmi:// hessian:// http:// webservice:// thrift:// memcached:// redis:// rest://
- Dubbo里面有哪几种节点角色
- Dubbo中怎么处理的超时断开
# 4.3.2 Mq
- RabbitMq
- Kafka
# 4.3.3 elasticsearch
- elasticsearch 了解多少,说说你们公司 es 的集群架构,索引数据大小,分片有多少,以及一些调优手段 。
- elasticsearch 的倒排索引是什么
- elasticsearch 是如何实现 master 选举的
- 详细描述一下 Elasticsearch 搜索的过程
# 4.3.4 Hbase
- 拓展类问题
# 4.3.5 otter
- 拓展类问题
# 4.4 工具
- Idea
- Maven
- Jenkins
- JMeter
# 4.5 架构
# 4.5.1 系统搭建
- MVC
- DDD 领域驱动设计
# 4.5.2 数据库设计
- 分库分表(水平拆分、垂直拆分)
- 业务场景
- 基础配置优化相关
# 4.5.3 服务治理
- 负载均衡
- 熔断
- 降级
- 限流
- 黑白名单
# 4.5.4 分布式任务
- xxl-job
# 4.5.5 监控
- 系统非入侵全链路监控
- TP99、TP999、QPS、TPS的熟悉程度
# 4.5.6 压测
- 是否压测过,有无经验
- 对系统健壮性的把控
- JVM参数
- GC调优
- 代码优化
# 4.6 环境
- Linux
- Tomcat
- docker
- k8s
# 5. 项目
- Lottery 抽奖系统 - 基于领域驱动设计的四层架构实践 (opens new window)
- Netty+JavaFx实战:仿桌面版微信聊天 (opens new window)
- API网关:中间件设计和实践 (opens new window)
# 5.1 项目经验
- 开发了哪些项目
- 重点项目是什么
- 你主要负责哪些
- 有过什么优化
# 5.2 工作业绩
- 中大型项目架构能力
- 复杂项目落地能力
- 重点项目执行落地
- 交付能力&质量
# 5.3 技术沉淀
- 方法论
- 流程规范制定
- 交付质量
- 公用组件建设
- 开源项目
- 复杂架构设计经验
- 团队技术分享
# 5.4 工程师品质
- 认知范围,技术、业务、运营
- 学习能力,接受能力
- 创新技术,迁移能力
# 5.5 疑难问题处理
- 复杂问题推进解决能力
- 紧急事故解决能力
# 5.6 项目推进
- 中大型项目推进落地
- 资源协调安排
- 流程规范实施
# 5.7 专业影响力
- 项目推进过程中方案执行落地
- 带动他人共同完成,并赋予能力提升
- 技术价值创造
- 开源项目和专利
# 6. 个人&面试官
# 6.1 个人
- 可能会有一个人性的问题
- 介绍自己部门是什么的
- 其他你早点入职
# 6.2 面试官
- 部门主要做什么业务
- 入职后承担哪块
- 有什么技术挑战需要提前学习了解的
# 五、总结
- 结合以上框架内容看自己是否是一个能抗住打的求职者,综合素质是否全面,技术栈广度、深度是否在瓶颈里徘徊,思考下怎么突破。
- 面试只是一份求职的开始,面试题也只是学习过程的知识点总结,只流于背题很容易被问倒。不同的面试官风格、水平、关注点也都不同,只有自己学扎实了才能随心所面。
- 以上的技术框架总结有一个xmind思维导图,以及面试简历,都可以通过在公众号:
bugstack虫洞栈
,回复资源下载进行获取。获取链接打开,找到ID:19